package com.tom.baselibrary.dialog;

import android.content.Context;
import android.content.DialogInterface;
import android.os.Build;
import android.util.SparseArray;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;

/**
 * 类去掉public 不让外界调用,只能这个包里面用。
 */
class AlertController {
    private AlertDialog mDialog;
    private Window mWindow;
    private DialogViewHelper mViewHelper; // 专门处理界面的工具

    public AlertController(AlertDialog dialog, Window window) {
        this.mDialog = dialog;
        this.mWindow = window;
    }

    // 设置ViewHelper
    public void setViewHelper(DialogViewHelper viewHelper) {
        this.mViewHelper = viewHelper;
    }

    public AlertDialog getDialog() {
        return mDialog;
    }

    // dialog的window。
    public Window getWindow() {
        return mWindow;
    }

    public void setText(int viewId, CharSequence text) {
        mViewHelper.setText(viewId, text);
    }
    public <T extends View> T getView(int viewId) {
        return mViewHelper.getView(viewId);
    }
    public void setOnClickListener(int viewId, View.OnClickListener listener) {
        // 再通过mViewHelper，绑定点击事件，获取View，setText
        mViewHelper.setOnClickListener(viewId, listener);
    }

    // 参数保存静态类
    public static class AlertParams {
        public Context mContext;
        public int mThemeResId;
        public boolean mCancelable = true; // 是否可取消(默认：点击空白区域)
        // cancel监听，消失监听。按键监听
        public DialogInterface.OnCancelListener mOnCancelListener;
        public DialogInterface.OnDismissListener mOnDismissListener;
        public DialogInterface.OnKeyListener mOnKeyListener;
        public View mView; // 显示的布局的view
        public int mViewLayoutResId; // 布局的layout_id，用于自定义dialog的view。

        // hashMap 保存,替换成SparseArray 更高效率，key是View 更好是int类型的。文本或按钮上的文字。
        public SparseArray<CharSequence> mTextArray = new SparseArray<>();
        // 存放view的点击事件。 SparseArray<WeakReference<View.OnClickListener>>  将所有事件保存起来。
        public SparseArray<View.OnClickListener> mOnClickArray = new SparseArray<>();
        // 宽度 高度：默认是包裹内容
        public int mWidth = ViewGroup.LayoutParams.WRAP_CONTENT;
        public int mHeight = ViewGroup.LayoutParams.WRAP_CONTENT;

        // 动画：默认没有动画
        public int mAnimations = 0;
        // 位置：默认中间
        public int mGravity = Gravity.CENTER;

        public AlertParams(Context context, int themeResId) {
            this.mContext = context;
            this.mThemeResId = themeResId;
        }

        // 绑定和设置参数到 Dialog 上
        public void apply(AlertController mAlert) {
            // 设置参数。
            // 1.设置dialog布局
            DialogViewHelper viewHelper = null;
            if (mViewLayoutResId != 0) {
                viewHelper = new DialogViewHelper(mContext, mViewLayoutResId);
            }
            if (mView != null) { // 直接设置的view
                viewHelper = new DialogViewHelper();
                viewHelper.setContentView(mView);
            }
            if (viewHelper == null) {
                throw new IllegalArgumentException("请设置布局 setContentView()");
            }
            // 设置布局
            mAlert.getDialog().setContentView(viewHelper.getContentView());
            // 设置AlertController的辅助类。
            mAlert.setViewHelper(viewHelper);

            // 2.设置文本，文本存放在集合中，需要遍历所有key(viewId), 得到对应的text。
            int textArraySize = mTextArray.size();
            for (int i = 0; i < textArraySize; i++) { // 遍历文本集合，给TextView设置文字内容
                // 分别获取key，value
                mAlert.setText(mTextArray.keyAt(i), mTextArray.valueAt(i));
            }
            // 3.设置点击事件
            int onClickArray = mOnClickArray.size();
            for (int i = 0; i < onClickArray; i++) {
                // 分别获取key，value
                mAlert.setOnClickListener(mOnClickArray.keyAt(i), mOnClickArray.valueAt(i));
            }

            // 4.配置自定义效果：全屏，从低部弹出来，默认动画效果... 关键类【Window】。
            Window window = mAlert.getWindow(); // dialog的window
            window.setGravity(mGravity); // 设置位置
            if (mAnimations != 0) {
                // 设置动画
                window.setWindowAnimations(mAnimations);
            }

            // 5.设置宽高
            WindowManager.LayoutParams params = window.getAttributes();
            params.width = mWidth; // 设置Dialog的宽高值（全屏）
            params.height = mHeight;
            window.setAttributes(params); // 重新设置dialog的宽高
        }
    }

}
